home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / tex / tex82.bug < prev    next >
Text File  |  1986-02-14  |  70KB  |  1,532 lines

  1. First updates to the TeX82 listing published in September, 1982.
  2. (These changes were included in the original Version 0 of TeX, but they
  3. were discovered after the listing went to press.)
  4.  
  5. 1. Module 943, line 6 (bug discovered 9/28)
  6. change "if cur_cmd=char_num then" to
  7.         if (cur_cmd=letter) or (cur_cmd=other_char) then r:=qi(cur_chr)
  8.         else if cur_cmd=char_num then
  9.  
  10. 2. "pause" changed to "pausing" and "pause_code" to "pausing code", throughout.
  11.  
  12. 3. Module 719, lines 8 and 11 (bug discovered 9/28)
  13. insert "rule_save:=overfull_rule; overfull_rule:=0;" after "save_ptr-2;"
  14. insert "overfull_rule:=rule_save;" before "q:=p+list_offset;"
  15. and insert a declaration of "overfull_rule: scaled" in module 716.
  16.  
  17. 4. Module 1128, lines 6 and following (bug discovered 9/28)
  18. change "while n<>0 do" to "loop"
  19. change "goto done" to
  20.         begin scan_left_brace; new_save_level(false_group);
  21.         goto done;
  22.         end
  23. change "... return 1130>;" to
  24.                 ... return 1130>
  25.         else if n=0 then
  26.                 begin new_save_level(case_group); goto done;
  27.                 end;
  28. and change "done: ... (false_group);" to "done:".
  29.  
  30. 5. Module 182, line 10 (suggestion by DRF on 9/30)
  31. change "0.0" to "?.?"
  32.  
  33. 6. Module 682, new definition of math_spacing (decision of 10/2)
  34. "0234000122*4000133**3**344*0400400*000000234000111*4111112341011"
  35.  
  36. 7. Module 684, new code for case "4" (decision of 10/2)
  37. "4": if cur_style<script_style then x:=thick_mu_skip_code else x:=0;
  38. [Also in module 682 line 7, say "...a conditional thick space (\nonscript..."]
  39.  
  40. 8. Module 11, trie_size changed from 7000 to 8000 because of new
  41. improved (but longer) hyphenation patterns (10/4)
  42.  
  43. 9. Module 453, forgot to change this when 454 changed (noted by DRF 10/6)
  44. format_default_length=20 (not 22)
  45. format_area_length=11 (not 13)
  46.  
  47.  
  48. Changes to TEX.WEB made after Version 0 was released in October, 1982.
  49.  
  50. Since copies of TEX.WEB are not supposed to be edited, there are
  51. two ways to make your version of TeX bug-free:
  52.         1. Get a new copy of TEX.WEB.
  53.         2. Put the corrections into your change file(s).
  54. Some people will find (1) easier than (2), except the main TeX sources at
  55. SCORE won't be updated quite as fast as the sources at SAIL (which have to
  56. be translated into ascii before they are sent to the outside world).
  57. Actually (2) will be quite easy, unless the list of changes becomes quite
  58. long, so it is the recommended procedure. In case (2) it would be useful
  59. to include a comment like "this is fix number xx" (using the numbering
  60. scheme in this file), so that the change could readily be deleted at some
  61. future time.
  62.  
  63. 10. Module 857 line -5 (bug discovered 10/8/92 by HWT)
  64. change it to: if h>0 then decr(h) else h:=trie_op_hash_size;
  65.  
  66. 11. Module 457 line 3 (typo discovered 10/9/82)
  67. change `\.!' to `\.\&'
  68.  
  69. 12. Module 1245 line 8 (bug fixed 10/9/82, discovered by MMD)
  70. insert the following between "begin" and "if":
  71. if format_ident<>0 then initialize; {erase preloaded format}
  72.  
  73. ** Version 0.1 incorporates the above changes.
  74.  
  75. 13. This is an extension to the language, put in to satisfy people who
  76. objected to the fact that \write (and \openout and \closeout) only
  77. caused action after being deferred to the next \shipout. Some applications
  78. call for immediate output, hence a new feature: \immediate followed by
  79. \openout or \write or \closeout causes the output action to take place
  80. without delay. For example, \immediate\write{x} is equivalent to
  81. \shipout\vbox{\write{x}} except that the latter also puts an empty
  82. page into the DVI file.
  83.  
  84. The extension requires the following new code:
  85. 13a. Insert `\immediate' after `\closeout' in module 1248.
  86. 13b. Define immediate_code=4 and include the following in module 1252:
  87.         primitive("immediate",extension,immediate_code);
  88. 13c. Include the following in module 1254:
  89.         immediate_code:print_esc("immediate");
  90. 13d. And, in module 1256:
  91.         immediate_code:@<Implement \.{\\immediate}@>;
  92. 13e. Finally, there's a new module inserted after old module 1280.
  93. Here is the WEB coding for this module:
  94.  
  95. @ The presence of `\.{\\immediate}' causes the |do_extension| procedure
  96. to descend to one level of recursion. Nothing happens unless \.{\\immediate}
  97. is followed by `\.{\\openout}', `\.{\\write}', or `\.{\\closeout}'.
  98. @^recursion@>
  99.  
  100. @<Implement \.{\\immediate}@>=
  101. begin get_nc_token;
  102. if (cur_cmd=extension)and(cur_chr<=close_node) then
  103.         begin p:=tail; do_extension; {append a whatsit node}
  104.         out_what(tail); {do the action immediately}
  105.         flush_node_list(tail); tail:=p; link(p):=null;
  106.         end
  107. else back_input;
  108. end;
  109.  
  110. ** Version 0.2 incorporates the above changes.
  111.  
  112. 14. Like change 11, this one doesn't affect the program, it just improves
  113. the documentation: Insert the following definitions in module 106:
  114. define set_glue_ratio_zero(#) == #:=0.0 {assign representation of zero ratio}
  115. define set_glue_ratio_one(#) == #:=1.0 {assign representation of unit ratio}
  116.  
  117. These macros are now introduced in a dozen or so future modules, thereby
  118. eliminating most of the system-dependent changes needed elsewhere for ratios.
  119. (Note: I also changed 0 to 0.0 in two places of module 182, where a glue_ratio
  120. comparision was being made.)
  121.  
  122. 15. Change of module 576 (discovered by HWT, 10/14/82)
  123. "hd:quarterword" should be "hd:eight_bits".
  124. (The same error occurs in module 522, but in that module the remedy is
  125. simply to delete the declaration of hd, since this variable is no longer used.)
  126.  
  127. 16. A most embarrassing bug (discovered by DRF, 10/14/82)
  128. Replace module 531 by:
  129.  
  130. @ A mild optimization of the output is performed by the |dvi_pop|
  131. routine, which issues a |pop| unless it is possible to cancel a
  132. `|push| |pop|' pair. The parameter to |dvi_pop| is the byte address
  133. following the old |push| that matches the new |pop|.
  134.  
  135. @p procedure dvi_pop(@!l:integer);
  136. begin if (l=dvi_offset+dvi_ptr)and(dvi_ptr>0) then decr(dvi_ptr)
  137. else dvi_out(pop);
  138. end;
  139.  
  140. Now we need to make a few changes to subsequent modules:
  141. 16a. In 549, after "incr(cur_s)", insert
  142.         if cur_s>0 then dvi_out(push);
  143. and before "decr(cur_s)", insert
  144.         if cur_s>0 then dvi_pop(save_loc);
  145.  
  146. 16b. Delete "dvi_out(push);" and "dvi_pop;" from modules 553, 558, 562, 567.
  147.  
  148. 16c. Change module 559 just as in 16a.
  149.  
  150. 17. Module 605, line 6 (discovered 10/15/82)
  151. The test should be "prev_depth>ignore_depth"
  152.  
  153. ** Version 0.3 incorporates the above changes.
  154.  
  155. 18. Module 11 (noticed by WLS, 10/16/82)
  156. Delete the definition of align_size (it's harmless but never used)
  157.  
  158. 19. (This change and the next cause major changes to the TRIP output;
  159. file TRIP.LOG and its relatives are being kept up to date on area [tug,dek].)
  160. The change avoids error messages when vpackage is called during output.
  161. Such messages can occur when there was no error, because the page is being
  162. boxed without the \skip glue from its insertions; so they should be omitted.
  163. The user who really wants such messages can still get them by saying
  164. "\setbox255=\vbox to 1ht255{\unbox255}".
  165. In module 903, insert the followng before the declaration of "wait":
  166.         save_vbadness:integer; {saved value of |vbadness|}
  167.         save_vfuzz: scaled; {saved value of |vfuzz|}
  168. Then in module 924, insert
  169.         save_vbadness:=vbadness; vbadness:=inf_bad;
  170.         save_vfuzz:=vfuzz; vfuzz:=max_dimen; {inhibit error messages}
  171. before the call on vpackage, and
  172.         vbadness:=save_vbadness; vfuzz:=save_vfuzz;
  173. after.
  174.  
  175. 20. Module 917 computes |page_size| improperly. (Noticed 10/21/82)
  176. Delete the statement "page_so_far[1]:=page_so_far[1]+width(q);"
  177. and change the preceding statement to:
  178.         page_size:=page_size-h-width(q);
  179. (The comment about page_so_far in the first paragraph of module 895 is
  180. correct; I mistakenly introduced a bug in module 917 some months after
  181. writing the first draft of the code, believing that I was making the
  182. algorithm more elegant or something.)
  183.  
  184. ** Version 0.4 incorporates the above changes.
  185.  
  186. 21. Since TeX82 applied to (the "woven" documentation) TEX.TEX uses
  187. about 11500 words of variable-size memory, I'm increasing hi_mem_size
  188. (in module 12) from 12000 to 13000. Actually, I recommend using considerably
  189. larger values for mem_max and hi_mem_size, whenever possible.
  190.  
  191. 22. Addition of the \boxmaxdepth parameter (10/22/82):
  192. This involves renumbering hfuzz_code through dimen_pars, in module 234,
  193. to numbers 9 through 18; inserting the lines
  194.         @d box_max_depth_code=8 {maximum depth of explicit vboxes}
  195.         @d box_max_depth==dimen_par(box_max_depth_code)
  196.         box_max_depth_code:print_esc("boxmaxdepth");
  197. to module 234 and
  198.         primitive("boxmaxdepth",assign_dimen,box_max_depth_code);
  199. to module 235; and changing the call on vpack in module 996 to
  200.         vpackage(link(head),saved(2),saved(1),box_max_depth);
  201.  
  202. ** Version 0.5 incorporates the above changes.
  203.  
  204. 23. Module 1224, line 4 (bug found by GMK/HWT on 10/26/82)
  205. change "(k+x>eqtb_size)" to "(k+x>eqtb_size+1)"
  206.  
  207. 24. Module 247, line 13 (bug found 10/26/82)
  208. (bug was reflected in TRIP.LOG but not noticed)
  209. change "ch_code(p)" to "ch_code(p-single_base)"
  210.  
  211. 25. Module 670, line 18 (bug found 10/27/82)
  212. interchange the statements "fetch(...)" and "math_type(...):=..."
  213. (since the fetch routine sometimes has a side-effect of changing math_type)
  214.  
  215. A major change (Version 0.6) made on October 28:
  216. The following list of changes counts as "number 26" on the list.
  217. Fonts now have identifiers instead of code numbers; the "\:" primitive
  218. has disappeared; and there are associated new features for "\the".
  219.  
  220. a. In module 11, delete bad_font_code.
  221. b. In modules 170 and 172, delete print_esc(":"), and change
  222.         `print_int(font_code' to `sprint_cs(font_ident'.
  223. c. In module 205, the comment for set_font is revised.
  224. d. In module 217, there are now five locations for control sequences
  225.         that are perpetually defined; undefined_control_sequence
  226.         is therefore defined to be frozen_control_sequence+5.
  227. e. In module 248, sprint_cs is now included among <Basic printing procedures>.
  228. f. Delete the primitive ":" in modules 250 and 251.
  229. g. Add to module 376: <Declare procedures that scan font-related stuff>
  230. h. In module 377, seven levels are now distinguished; we define
  231.         font_val=4, ident_val=5, tok_val=6.
  232. i. In module 380, delete the previous cases for def_family and set_font,
  233.         and the following takes the place of case assign_toks:
  234.           assign_toks,def_family,set_font,def_font: <Fetch a token list or
  235.                 font number or font identifier, provided that level=tok_val>;
  236. j. Module 382 (which now has a new name) has this new ending:
  237.         else if cur_cmd=assign_toks then scanned_result(equiv(m))(tok_val)
  238.         else <Fetch a font number or a font identifier>
  239. k. Module 389 becomes
  240.         <Fetch a font number or a font identifier>=
  241.         if cur_cmd=set_font then scanned_result(cur_chr)(font_val)
  242.         else if cur_cmd=def_font then
  243.                 scanned_result(font_ident[cur_font])(ident_val)
  244.         else    begin scan_four_bit_int;
  245.                 scanned_result(font_ident[equiv(m+cur_val)])(ident_val);
  246.                 end
  247. l. In module 393, the relation `<>tok_val' becomes `<=mu_val'.
  248. m. In module 426, the relation `=tok_val' becomes '>=ident_val'.
  249.         Also add a new case to the case statement:
  250.           font_val: begin print(font_name[cur_val]);
  251.                 if font_size[cur_val]<>font_dsize[cur_val] then
  252.                         begin print(" at "); print_scaled(font_size[cur_val]);
  253.                         print("pt");
  254.                         end;
  255.                 end;
  256. n. The body of module 427 becomes:
  257.         begin p:=temp_head; link(p):=null;
  258.         if cur_val_level=ident_val then store_new_token(cs_token_flag+cur_val)
  259.         else if cur_val<>null then
  260.                 begin r:=link(cur_val); {do not copy the reference count}
  261.                 while r<>null do
  262.                         begin store_new_token(info(r)); r:=link(r);
  263.                         end;
  264.                 end;
  265.         the_toks:=p;
  266.         end
  267. o. In module 480, delete user_font_code; there's a new comment:
  268.         When the user defines \font\f, say, TeX assigns an internal number
  269.         to the user's font \f. For example, if this internal number is 13,
  270.         we will have font_ident[13]=p and equiv(p)=13, where p is the eqtb
  271.         location of the control sequence \f.
  272. p. In module 481, delete the declaration of font_number, and
  273.         replace the declaration of font_code by
  274.           font_ident:array[internal_font_number] of pointer;
  275. q. New stuff in module 483 (also delete references to font_number, font_code):
  276.         define bad_font_ident=frozen_control_sequence+4 {denotes a null font}
  277.         font_name[undefined_font]:="nullfont";
  278.         font_ident[undefined_font]:=bad_font_ident;
  279.         text(bad_font_ident):="nullfont"; eq_level(bad_font_ident):=level_one;
  280.         eq_type(bad_font_ident):=set_font;
  281.         equiv(bad_font_ident):=undefined_font;
  282. r. In module 490, parameter u is new of type pointer, and the
  283.         read_font_info subroutine is changed to a function that
  284.         returns an internal_font_number. There's a new local variable
  285.           g:internal_font_namber; {the number to return}
  286.         and we set g:=undefined_font immediately upon entering read_font_info.
  287.         Also set read_font_info:=g just before exiting.
  288. s. In module 491, print_int(u) becomes sprint_cs(u).
  289. t. Delete the statements involving font_code and font_number in module 506,
  290.         and set g:=f at the end of that module.
  291. u. The body of module 507 becomes:
  292.         <Declare procedures that scan font-related stuff>=
  293.         procedure scan_font_ident;
  294.         var f:internal_font_number;
  295.         begin <Get the next non-blank non-call...>;
  296.         if cur_cmd=set_font then f:=cur_chr
  297.         else    begin print_nl("! Missing font identifier");
  298.                 help2("I was looking for a control sequence whose")
  299.                 ("current meaning has been defined by \font.");
  300.                 back_error; f:=undefined_font;
  301.                 end;
  302.         end;
  303. v. New beginning of module 508:
  304.         The following routine is used to implement `\texinfo f n'.
  305.         The boolean parameter writing is set true if the calling program
  306.         intends to change the parameter value.
  307.         <Declare procedures that scan font-related stuff>=
  308. and "scan_font_number" is changed to "scan_font_ident".
  309. w. In module 509, "print_int(font_code" becomes "sprint_cs(font_ident".
  310.         Also "font code is defined" becomes "\font is loaded" in the help.
  311. x. In module 940, the first line of help is changed to
  312.         "You have to specify a font identifier,"
  313. y. The set_font case in module 1138 reduces to
  314.         set_font: define(cur_font_loc,data,cur_chr);
  315. z. In module 1153, delete all the complicated stuff starting with "scan_int"
  316.         and substitute simply this:
  317.                 scan_font_ident; define(p,data,cur_val);
  318.                 end;
  319. aa. Change new_font to new_font(a) in module 1169, and add parameter
  320.           (a:small_number)
  321.         in module 1170. Also add the label common_ending, and declare
  322.         variable u to have type pointer. The code beginning with "scan_int"
  323.         is changed to the following:
  324.           get_token;
  325.           if cs_ptr=0 then
  326.                  <Complain about the missing control sequence and return>;
  327.           u:=cs_ptr; scan_optional_equals; scan_file_name;
  328.           <Scan the ``at'' size specification>;
  329.           <If this font has already been loaded, set f to the internal
  330.                 font number and goto common_ending>;
  331.           f:=read_font_info(u,cur_name,cur_area,s);
  332.           common_ending: define(u,set_font,f); font_ident[f]:=u;
  333.           exit:end;
  334. bb. New module 1172:
  335.         When the user gives a new identifier to a font that was previously
  336.         loaded, the new value becomes the font_ident of record.
  337.         Font names `xyz' and `XYZ' are considered to be different.
  338.         <If this font has already been loaded...>=
  339.         for f:=font_base+1 to font_ptr do
  340.                 if [the test previously in module 1174] then goto common_ending
  341. cc. New module 1173:
  342.         <Complain about the missing control sequence and return>=
  343.         begin print_nl("! A font identifier must be a control sequence");
  344.         help2("You should say, e.g., `\font\f=fontfilename'.")
  345.         ("(I'm going to ignore the \font command you just gave.)");
  346.         back_error; return;
  347.         end
  348. dd. New module 1174:
  349.         <Cases of print_cmd_chr...>=
  350.         set_font:begin print("select font "); print(font_name[chr_code]);
  351.                 if font_size[chr_code]<>font_dsize[chr_code] then
  352.                         begin print(" at "); print_scaled(font_size[chr_code]);
  353.                         print("pt");
  354.                         end;
  355.                 end;
  356. ee. Delete the comment at the beginning of module 1227, and delete the
  357.         loop for k:=0 to bad_font_code-1, and delete dump_int(undefined_font).
  358. ff. Delete the repeat loop in module 1228.
  359. gg. Change font_code to font_ident in module 1229, and change
  360.         print_int(font_code to sprint_int(font_ident.
  361. hh. In module 1230,
  362.         begin undump(single_base)(undefined_control_sequence)(font_ident[k]);
  363.         undump_qqqq(font_check[k]); [and continue as before]
  364.  
  365. The changes above have been incorporated into Version 0.6.
  366.  
  367. The ill-fated Version 0.7
  368.  
  369. 27. (Here's a change that I retracted shortly after making it, since I
  370. discovered that the source was flaky after all; and I also found a reliable
  371. source [NBS Circular 570] confirming my original information. I include
  372. the note here only for historical purposes...)
  373.  
  374. "After years of searching, I've finally found a definitive definition of
  375. the printer's point; and (unfortunately) my previous conjecture was wrong.
  376. The truth is that 83pc=35cm, exactly; so I am changing TeX to conform.
  377. This means some changes in the comments of modules 101 and 517, and the
  378. following changes to the program:
  379.  
  380. "27a. In modules 547 and 571, the appropriate DVI numbers are now:
  381.         dvi_four(109375); dvi_four(2039808); {conversion ratio for sp}
  382. "27b. The guts of module 418 become:
  383.         if scan_keyword("in") then set_conversion(63246)(875)
  384.         else if scan_keyword("pc") then set_conversion(12)(1)
  385.         else if scan_keyword("cm") then set_conversion(996)(35)
  386.         else if scan_keyword("mm") then set_conversion(498)(175)
  387.         else if scan_keyword("bp") then set_conversion(10541)(10500)
  388.         else if scan_keyword("dd") then set_conversion(996)(931)
  389.         else if scan_keyword("cc") then set_conversion(11952)(931)
  390.         else..."
  391.  
  392. *** Version 0.7 of TeX incorporated the changes above (82/10/30);
  393. this version was withdrawn on 82/11/2.
  394.  
  395. Changes subsequent to Version 0.6
  396.  
  397. 28. The experience with #27 did lead me to one improvement, thanks
  398. to Chuck Bigelow, with respect to Didot points. (11/4/82)
  399. Add the following comment to module 418:
  400.         According to the definitions here, $\rm2660\,dd\approx1000.33297\,mm$;
  401.         this agrees well with the value $\rm1000.333/,mm$ cited by Bosshard
  402.         in {\sl Technische Grundlagen zur Satzherstellung\/} (Bern, 1980).
  403. And change two lines of the code there as follows:
  404.         else if scan_keyword("dd") then set_conversion(1238)(1157)
  405.         else if scan_keyword("cc") then set_conversion(14856)(1157)
  406.  
  407. 29. The new font material is made more robust by ensuring that \the\font
  408. always returns a pointer to a control sequence whose command code is
  409. set_font. (Change 11/4/82)
  410.  
  411. 29a. The code changed in 26aa is changed again, to the following:
  412.         <If the next token isn't a control sequence, issue a complaint and
  413.                 return; otherwise set u:=cs_ptr, and set hash_used to the
  414.                 location of a ``frozen'' copy of the new font identifier>;
  415.         define(u,set_font,undefined_font);
  416.         scan_optional_equals; scan_file_name;
  417.         <Scan the ``at'' size specification>;
  418.         <If this font has already been loaded, set f to the internal
  419.                 font number and goto common_ending>;
  420.         f:=read_font_info(u,cur_name,cur_area,s);
  421.         common_ending: equiv(u):=f; geq_define(hash_used,set_font,f);
  422.         font_ident[f]:=hash_used;
  423.         exit:end;
  424. 29b. Instead of 26cc, here's the new module 1173:
  425.         We reserve a special control sequence for the font identifier;
  426.         this one cannot be redefined by the user, so it is safe to
  427.         return it as a value of \the\font.
  428.         <If the next token isn't a control sequence...>=
  429.         get_token;
  430.         if cs_ptr<hash_base then
  431.             begin print_nl(
  432.              "! A font identifier must be a multiletter control sequence");
  433.             help2("You should say, e.g., `\font\ffn=fontfilename'.")
  434.             ("(I'm going to ignore the \font command you just gave.)");
  435.             back_error; return;
  436.             end;
  437.         repeat if hash_is_full then overflow("hash size",hash_size);
  438.         decr(hash_used);
  439.         until text(hash_used)=0; {search for an empty location in hash}
  440.         u:=cs_ptr; text(hash_used):=text(u); {copy the name}
  441.         stat incr(cs_count); tats
  442.  
  443. 30. Module 993, replace lines 5 to 7 (11/5/82):
  444. else    begin if k=vmode then new_save_level(vbox_group)
  445.         else    begin new_save_level(vtop_group); k:=vmode;
  446.                 end;
  447.         if looseness<>0 then eq_word_define(int_base+looseness_code,0);
  448.         if hanging_indent<>0 then
  449.                 eq_word_define(dimen_base+hanging_indent_code,0);
  450.         if par_shape_ptr<>null then eq_define(par_shape_loc,shape_ref,null);
  451.         end;
  452.  
  453. 31. Module 403, replace line 5 (11/6/82):
  454. if cur_tok<cs_token_flag then
  455.         begin cur_val:=cur_chr;
  456.         if cur_cmd<=right_brace then
  457.                 if cur_cmd=right_brace then incr(align_state)
  458.                 else decr(align_state);
  459.         end
  460.  
  461. 32. Improvements to error recovery for bad alignments (11/6/82):
  462. In module 1039, replace "begin align_error; goto reswitch; end" by "align_error"
  463. In module 1040, delete "cur_cmd:=left_brace;" and "cur_cmd:=right_brace;"
  464.         and change "error" to "back_error"
  465. In module 1041, delete "cur_cmd:=relax;"
  466.  
  467. 33. More power to \let (11/8/82):
  468. 33a. Module 1141 becomes:
  469.         <Assignments>+=
  470.         let:    begin get_token;
  471.                 if cs_ptr<>0 then <Carry out the \let operation>
  472.                 else    begin print_nl
  473.                          ("! You can use \let only with control sequences");
  474.                         help2("I'm not \let-ting anything change here,")
  475.                                 ("since I can only do things like `\let\a=b'.");
  476.                         back_error;
  477.                         end;
  478.                 end;
  479. 33b. Module 1142 becomes:
  480.         <Carry out the \let...>=
  481.         begin p:=cs_ptr;
  482.         repeat get_token;
  483.         until cur_cmd<>spacer;
  484.         if cur_tok=other_token+"=" then
  485.                 begin get_token;
  486.                 if cur_cmd=spacer then get_token;
  487.                 end;
  488.         if cur_cmd>=call then add_token_ref(cur_chr);
  489.         define(p,cur_cmd,cur_chr);
  490.         end
  491.  
  492. 34. This change helps you see an undefined control sequence
  493. in certain unusual cases (discovered by JDH, 11/8/82):
  494. Add the clause "(base_ptr=input_ptr) or" to module 294, line 2.
  495.  
  496. 35. Here's an improvement in the formula for demerits; previously
  497. more weight was given to minimizing bad spacing on lines with penalties,
  498. so that (slightly loose hyphenated line)(OK line) was considered worse
  499. than (OK hyphenated line)(quite loose line). (fixed 11/8/82)
  500. Change lines 2--7 of module 772 to the following:
  501.         d:=line_penalty+b; d:=d*d;
  502.         if pi<>0 then
  503.                 if pi>0 then d:=d+pi*pi
  504.                 else if pi>eject_penalty then d:=d-pi*pi;
  505.  
  506. 36. Minor change to save buffer space in non-INITEX (11/10/82):
  507. Enclose the declaration of pool_file in module 50 by init...tini.
  508.  
  509. 37. Minor improvement in format for the context of error messages (11/13/82):
  510. 37a. Module 289, type "inserted" split into "backed_up=3", "inserted=4"
  511. and the other type numbers increase: "macro=5", etc.
  512. 37b. In module 296, backed_up: if loc=null then print_nl("<recently read>")
  513.                         else print_nl("<to be read again> ");
  514.                 inserted: print_nl("<inserted text> ");
  515. 37c. Minor changes to comments in modules 289 and 293.
  516. 37d. Change "inserted" to "backed_up" in module 294.
  517. 37e. Add definition "back_list(#)==begin_token_list(#,backed_up)" in module 305.
  518. 37f. In module 306, first test should be ">=backed_up", second "<=inserted".
  519. 37g. Change ins_list to back_list in modules 307, 318, 375, 1195.
  520. 37h. Add definition to module 308:
  521.         ins_error==begin back_error; token_type:=inserted; end
  522. 37i. Change back_error to ins_error in modules 362, 1040, 1046.
  523. 37j. Change "<to be read again>" to "<inserted text>" in module 973 help.
  524.  
  525. 38. Module 407, the error message is changed (11/11/82) to:
  526. "! Missing number, treated as zero".
  527.  
  528. 39. Fix anomaly when hbadness or vbadness is small (11/11/82):
  529. Module 593, line 2, "if (-x-total_shrink[normal]>hfuzz) or (hbadness<100)"
  530. Module 603, line 2, "if (-x-total_shrink[normal]>vfuzz) or (vbadness<100)"
  531.  
  532. 40. Added the \tokens primitive (11/13/82):
  533. In module 223, defined tokens_loc and tokens (analogous to every_par).
  534. In module 225, defined the primitive.
  535. In module 1146, changed the comment to include tokens_loc as a possibility.
  536.  
  537. 41. Change get_nc_token to get_token in module 374 (11/13/82).
  538. (In particular \def\foo{...}\foo won't say "undefined c.s." now!)
  539. (This change later retracted during debugging; it was found that
  540. "endv" aborts the job, so this cure was worse than the disease. Then
  541. it was re-established as part of the major change to conditionals,
  542. because endv needed to be more robust anyway.)
  543.  
  544. 42. In module 699, we make \span expand in a preamble (11/13/82).
  545. Change lines -7 through -3 to:
  546.         begin get_nc_token; goto reswitch;
  547.         end;
  548.  
  549. 43. Modules 321 and 322 have been altered for better efficiency (11/12/82)
  550. and better exposition; the three conditions of module 322 are now
  551. in separate if tests.
  552.  
  553. 44. Frozen control sequences are now unredefinable. (11/16/82)
  554. A new procedure get_r_token has been introduced to give uniform error
  555. messages for \def, \let, \read, \font, \mathchardef, and to make them
  556. incapable of changing the frozen equivalents.
  557.  
  558. Incidentally, get_nc_token is changed to get_x_token; and ch_code
  559. becomes cat_code.
  560.  
  561. A major change (Version 0.8) made on November 14--16:
  562. Conditional statements are taken from semantics to syntax.
  563.  
  564. This change, which counts as number 45 on the list, made it necessary
  565. to renumber the modules. And it was such a drastic change, the
  566. differences can only be sketched here, using the old module numbers
  567. for reference. A variety of other things were cleaned up because this
  568. change made it more natural for them to be handled differently.
  569.  
  570. 45a. Module 158, inserted a permanently empty token list called null_list.
  571. 45b. Module 204, deleted if_test, case_branch, else_code, convert;
  572.         inserted end_cs_name.
  573. 45c. Module 206, inserted if_test, fi_or_else, cs_name, convert, and
  574.         end_template (the latter comes after long_outer_call).
  575. 45d. Module 217, there are now nine frozen control sequences; also null_cs.
  576. 45e. Modules 247 and 248, must be able to print a null control sequence.
  577. 45f. Module 268 (leave_transparent_group) disappears; comments in the
  578.         previous modules also are appropriately simplified.
  579. 45g. Module 273, delete endv_token.
  580. 45h. Modules 277 and 278, delete references to endv (it no longer appears).
  581. 45i. After module 281, a procedure show_cur_cmd_chr takes the
  582.         code for tracing commands from module 937.
  583. 45j. Module 317 now forbids \outer control sequences when skipping,
  584.         and inserts \fi in front of them, for error recovery.
  585. 45k. Module 334 now uses null_cs if carriage-return is an escape.
  586. 45l. Module 343 no longer has endv test.
  587. 45m. Module 344, major extensions to expand_calls make it several modules
  588.         longer. It saves global variables like cur_val. It changes
  589.         end_template to endv. It processes cs_name and convert.
  590.         It processes if_test by calling the "conditional" procedure.
  591.         It processes fi_or_else by checking their legality, and (if legal)
  592.         updating the if stack.
  593. 45n. Module 373 (pass_block) disappears.
  594. 45o. After module 400, radix and cur_val and cur_val_level are initialized.
  595. 45p. Module 428 changes so that conv_toks is a procedure rather than a
  596.         function; this procedure is invoked by expand_calls.
  597. 45q. Modules 436 and 1032, delete reference to conv_toks.
  598. 45r. After module 443, the entire part 48 moves to this part of the program,
  599.         and the parts are renumbered accordingly. \case is changed to
  600.         \ifcase, and it resides under the if_test command.
  601.         New routines are inserted to maintain a linked stack that records
  602.         the current state of conditionals. There's a procedure
  603.         pass_text that skips text while looking for \fi or \else or \or
  604.         on level zero with respect to \if...\fi nesting. The previous
  605.         routines for skip control via handle_right_brace are eliminated,
  606.         and the new ones are somewhat simpler. The new \ifcat is mostly
  607.         combined with the old \if; they no longer ignore spaces.
  608.         The scanner_status is set to normal while processing \ifx.
  609.         \ifx will consider \a to equal 0 after \let\a=0.
  610. 45s. Modules 701, 707: endv_token is replaced by a token for a frozen
  611.         control sequence whose command code end_template makes it behave
  612.         like an outer_call. After expand_calls, it is converted to another
  613.         frozen control sequence, whose command code is endv. This two-step
  614.         facilitates error recovery, instead of giving a fatal error stop.
  615. 45t. Module 874, remove "pass_block(1); goto done".
  616. 45u. After module 1047, routine for end_cs_name prints an error message.
  617. 45v. Module 1049, get_nc_token becomes get_token. (else $\ifmmode fails)
  618. 45w. Module 1202 gets another case (end_template).
  619. 45x. Module 1243, new warning is printed if the if stack isn't empty.
  620.  
  621. Changes after version 0.8
  622.  
  623. 46. Declare c : ascii_code in module 825 (noted by DRF, 11/21/82)
  624.  
  625. 47. Module 776 lines 4-6 (suggested by DRF, 11/21/82)
  626. threshold:=pretolerance;
  627. if threshold>=0 then
  628.         begin stat if tracing_stats>2 then
  629.                 begin begin_diagnostic; print_nl("@@firstpass");
  630.                 end; tats
  631.         second_pass:=false;
  632.         end
  633. else    begin threshold:=tolerance; second_pass:=true;
  634.         end;
  635.  
  636. 48. Protection for DVI files (added 11/16/82)
  637. Replace lines 2 and 3 of module 570 by:
  638.         <Update the values of max_h and max_v; but if the page is too large,
  639.                 goto done>;
  640. Move the statement "dead_cycles:=0" from module 570 to module 568.
  641. Declare "label done;" in module 568.
  642. And add the following new module after 570:
  643.  
  644. @ Sometimes the user will generate a huge page because other error messages
  645. are being ignored. Such pages are not output to the \.{dvi} file, since they
  646. may confuse the printing software.
  647.  
  648. @<Update the values of |max_h| and |max_v|; but if the page is too large...@>=
  649. if (height(p)>max_dimen)or(depth(p)>max_dimen)or(width(p)>max_dimen) then
  650.         begin print_nl("! Huge page cannot be shipped out");
  651.         help2("The page just created is more than 18 feet tall or")@/
  652.          ("more than 18 feet wide, so I suspect something went wrong.");
  653.         error;
  654.         if tracing_output=0 then
  655.                 begin begin_diagnostic;
  656.                 print_nl("The following box has been deleted:");
  657.                 show_box(p);
  658.                 end_diagnostic(true);
  659.                 end;
  660.         goto done;
  661.         end;
  662. if height(p)+depth(p)>max_v then max_v:=height(p)+depth(p);
  663. if width(p)>max_h then max_h:=width(p)
  664.  
  665. 49. New features \everymath and \everydisplay (12/2/82).
  666. Make changes analogous to those for "\tokens" (see change 40).
  667. Put the following just before the end of module 1050:
  668.   if every_math<>null then begin_token_list(every_math,every_math_text);
  669. And put the following just before the end of module 1056:
  670.   if every_display<>null then
  671.         begin_token_list(every_display,every_display_text);
  672.  
  673. 50. New feature \futurelet (12/2/82):
  674. Module 1141 changes again. (Also, "let" and "futurelet" share cmd code "let".)
  675. let:    begin n:=cur_chr;
  676.         get_r_token; p:=cs_ptr;
  677.         if n=normal then
  678.                 begin repeat get_token;
  679.                 until cur_cmd<>spacer;
  680.                 if cur_tok=other_token+"=" then
  681.                         begin get_token;
  682.                         if cur_cmd=spacer then get_token;
  683.                         end;
  684.                 end
  685.         else    begin get_token; q:=cur_tok; get_token; back_input;
  686.                 cur_tok:=q; back_input; {look ahead, then back up}
  687.                 end; {|back_input| doesn't affect |cur_cmd|, |cur_chr|}
  688. and continue with "if cur_cmd>=call", as before.
  689.  
  690. *** The changes above have been incorporated into version 0.9 of TeX.
  691.  
  692. Changes after version 0.9
  693.  
  694. 51. new \endinput primitive (suggested by FY, 12/7/82):
  695. \input and \endinput both use the same command code. The cases in module
  696. 955 are deleted and replaced by those in module 965 (which disappears),
  697. because \input is now allowed in any mode. The code for any_mode(input)
  698. is "if cur_chr=0 then start_input else force_eof:=true", and it moves from
  699. module 952 to just before module 1197. The global variable force_eof
  700. is initially false, and module 340 becomes (after first:=start;)
  701.         if not force_eof then
  702.                 begin if input_ln.... else force_eof:=true;
  703.                 end;
  704.         if force_eof then begin print_char(")"); force_eof:=false;...
  705.  
  706. 52. Module 1005, line 4 (12/8/82)
  707. change "if align_state<0" to "if (mode<0)or(align_state<0)"
  708. (This avoids embarrassing case where TeX says "type a command or say \end"
  709. but when you type \end it says "You can't use \end in restricted horiz mode".)
  710.  
  711. 53. Patch to the new code for \csname (12/21/82)
  712. After eq_type(cs_ptr):=relax, also say equiv(cs_ptr):=256.
  713. (This corrects a bug that would appear only if \csname occurs right
  714. after a file name.)
  715.  
  716. 54. Change 47 introduced a bug when tracingonline=0 (12/20/82)
  717. when omitting firstpass, also do "if tracing_stats>2 then begin_diagnostic;"
  718.  
  719. 55. \hskip -1pt plus 2pt was parsed as \hskip -(1pt plus 2pt)! (12/20/82)
  720. In module 421, before line -4, insert the following:
  721.         if negative then
  722.                 begin cur_val:=-cur_val; negative:=false;
  723.                 end;
  724. But then realize that "negative" is always false on line -2; simplify.
  725.  
  726. 56. Cosmetic change to paragraph statistics (12/23/82)
  727. tight_fit..very_loose_fit codes have been renumbered very_loose_fit..tight_fit.
  728.  
  729. 57. Module 729 changes to make TeX language more consistent (12/23/82):
  730. else if type(tail)<>glue_node then tail_append(new_penalty(inf_penalty))
  731. else    begin type(tail):=penalty_node; delete_glue_ref(glue_ptr(tail));
  732.         flush_node_list(leader_ptr(tail)); penalty(tail):=inf_penalty;
  733.  
  734. 58. Commas are allowed as alternates to radix points. (12/23/82)
  735. define continental_point_token=other_token+"," {decimal point, Eurostyle}
  736. in module 400, and insert the following twice in 409:
  737.         if cur_tok=continental_point_token then cur_tok:=point_token;
  738.  
  739. 59. \hangindent becomes a normal parameter. (12/23/82)
  740. This simplifies the code in obvious ways; for example, module 1148 disappears.
  741. The command code hang_indent goes away too; what was previously called
  742. hanging_indent is then renamed hang_indent.
  743.  
  744. 60. \prevgraf becomes accessible. (12/23/82)
  745. This involves renaming the "after" field "pg_field" in the nest array;
  746. making a new command code set_prev_graf;
  747. including the following loop into scan_the:
  748.         nest[nest_ptr]:=cur_list; p:=nest_ptr;
  749.         while abs(nest[p].mode_field)<>vmode do decr(p);
  750.         scanned_result(nest[p].pg_field)(int_val);
  751. and including the following active procedure for any_mode(set_prev_graf):
  752.         procedure change_prev_graf;
  753.         var p:0..nest_size; {index into |nest|}
  754.         begin nest[nest_ptr]:=cur_list; p:=nest_ptr;
  755.         while abs(nest[p].mode_field)<>vmode do decr(p);
  756.         scan_optional_equals; scan_int;
  757.         if cur_val<0 then
  758.                 begin print_nl("! Bad \prevgraf");
  759.                 help1("I allow only nonnegative values here.");
  760.                 int_error(cur_val);
  761.                 end
  762.         else    begin nest[p].pg_field:=cur_val; cur_list:=nest[nest_ptr];
  763.                 end;
  764.         end;
  765.  
  766. 61. \clubpenalty is split off from \widowpenalty. (12/23/82)
  767.  
  768. 62. Bad bug in module 1005 (12/24/82)
  769. (must not go to reswitch if \par is a macro!)
  770. Instead of setting cur_cmd and cur_chr and goto reswitch, just back_input
  771. and set token_type:=inserted.
  772.  
  773. 63. \openin not to prompt if file not present (12/25/82)
  774. Change lines -4 and -3 of module 1183 to:
  775.         if a_open_in(read_file[n]) then read_open[n]:=just_open
  776.         else read_open[n]:=closed;
  777.  
  778. 64. New \jobname primitive (12/25/82)
  779. It is added to the "convert" command in the obvious way.
  780. In conv_toks, the relevant code is
  781.         if job_name=0 then open_log_file
  782. before "selector" is changed and
  783.         print(job_name)
  784. after.
  785.  
  786. 65. Better error recovery for math-only things (12/25/82):
  787. In module 952, don't goto reswitch after insert_dollar_sign.
  788. In module 954, first back_input, then set cur_tok, and
  789. don't bother to set cur_chr or cur_cmd; ins_error instead of back_error.
  790.  
  791. 66. Module 1163, line 3, insert "scan_optional_equals" (12/25/82).
  792. Also make \the\parshape allowed.
  793.  
  794. 67. The location where an \if begins is stacked (12/26/82)
  795. so that a better error message can be given for \end while \if is incomplete.
  796. This means two-word nodes instead of one-word nodes in the if stack.
  797.  
  798. 68. Change 30 is extended to \insert, \vadjust, \valign, \output (12/26/82)
  799. The one-time-only paragraph parameters are now cleared by a
  800. subroutine called normal_paragraph; hang_after is also set to 1.
  801. The essential change being made now is to call normal_paragraph in modules
  802. 704, 932, 1009, and 1076.
  803.  
  804. 69. \pagetotal and \pagegoal are added (12/27/82)
  805. The changes are analogous to, but simpler than, those for \prevgraf.
  806.  
  807. 70. Tracing of page-optimization calculations (12/27/82)
  808. A bunch of print commands are added to modules 897, 914, and 918,
  809. activated if tracing_pages>0. Also, \tracingparagraphs is separated
  810. from \tracingstats.
  811.  
  812. **** The changes above have been incorporated into version 0.91 of TeX
  813.  
  814. 71. The build_page procedure is broken in two parts (Dec 31, 1982)
  815. by making module 919 into a procedure called fire_up.
  816.  
  817. 72. \ifeven1\else is made legal by introducing if_code (Dec 31, 1982)
  818. This improves part of the code in change 45; if_limit has a specific
  819. value that recovers automatically from a former syntax error.
  820.  
  821. 73. Improvement to alignments when columns don't occur (Dec 31, 1982)
  822. Delete module 711; and where it was used in module 708, say this:
  823.         begin fin_col:=true; return;
  824.         end;
  825. Also, in module 717, replace the statement "width(q):=0" by
  826. "<Nullify width(q) and the tabskip glue following the current column>"
  827. where that new module has the following code:
  828.         begin width(q):=0; r:=link(q); s:=glue_ptr(r);
  829.         if s<>zero_glue then
  830.                 begin add_glue_rel(zero_glue); delete_glue_ref(s);
  831.                 glue_ptr(r):=zero_glue;
  832.                 end;
  833.         end
  834.  
  835. 74. Better error message in overfull alignment (Dec 31, 1982)
  836. In module 717, don't set both height and width; set the height zero.
  837. Then in module 719, switch width to height if necessary.  (People didn't
  838. understand the previous error messages, and I couldn't blame them.)
  839.  
  840. *** The changes above have been incorporated into version 0.92 of TeX82
  841. *** (which was the last version of 1982, completed 11:59pm on December 31)
  842.  
  843. The first changes after 1982
  844.  
  845. 75. Modules 961 and 962 should be one module. (Jan 3, 1983)
  846. Also, the absolute constant 100 is replaced, and the test becomes
  847.         if ((page_head=page_tail)and(head=tail)and(dead_cycles=0))or
  848.                  (dead_cycles>max_dead_cycles) then
  849.  
  850. 76. Surprise bug: module 1010. (Jan 3, 1983)
  851. The case "if head<>tail" needs an else clause: else pop_nest.
  852. Also remove the "<Scan an optional space>" in that module.
  853.  
  854. 77. Improvement to change 22 (Jan 4, 1983)
  855. In module 996, use box_max_depth from inside the \vbox:
  856.         @!d:scaled; {maximum depth}
  857.         begin d:=box_max_depth; unsave;... vpackage(...,d);
  858.  
  859. 78. \groupbegin and \groupend changed to \begingroup and \endgroup (Jan 4, 83)
  860.  
  861. 79. \deadcycles made accessible (Jan 4, 83)
  862.  
  863. 80. New calculations for split insertions (Jan 4, 83)
  864. In module 918, we now work with natural width, and add in the page depth too:
  865. The line "else w:=x_over_n..." is changed to
  866.         else    begin w:=page_goal-page_total-page_depth;
  867.                 if count(n)<>1000 then w:=x_over_n(w,count(n))*1000;
  868.                 end;
  869. (Note that cur_page_height and cur_page_depth and page_size have been
  870. renamed page_total, page_depth, and page_goal, in accordance with new syntax.)
  871.  
  872. *** The changes above have been incorporated into Version 0.93
  873.  
  874. 81. Old bug finally unearthed by PHY (Jan 6, 1983)
  875. insert "incompleat_node:=null;" after "push_nest;" in module 1097.
  876.  
  877. 82. Extension of change 69: \pageshrink, etc. added (Jan 6, 1983)
  878.  
  879. 83. \floatingpenalty and \insertpenalties added (Jan 6, 1983)
  880. Also, the insertion nodes now have a new format, so that the values of
  881. \floatingpenalty, \splittopskip, and \splitmaxdepth can be stored with
  882. each insertion; this requires the obvious changes in several places:
  883. a) Module 136, ins_node has fields float,depth,height,ins_ptr,split_top_ptr
  884. b) Module 184, these fields are displayed
  885. c) Module 198, ins_node case, also delete_glue_ref(split_top_ptr(p))
  886. d) Module 202, ins_node case, also add_glue_ref(split_top_ptr(p))
  887. e) Modules 226-228, new integer parameter \floatingpenalty
  888. f) Module 883, add parameter d to vert_break subroutine
  889. g) Module 885, use d instead of split_max_depth
  890. h) Module 890, argument split_max_depth to call of vert_break
  891. i) Module 894, change width to height (better name)
  892. j) Module 900, initialize insert_penalties here, not in 901
  893. k) Module 914, cost to be awful_bad if insert_penalties>=10000
  894. l) Module 916, add float(p) to insert_penalties if type(r)<>inserting
  895. m) Module 916, subtract page_depth from delta
  896. n) Module 918, subtract page_shrink from delta
  897. o) Module 918, argument depth(p) to call of vert_break
  898. p) Module 921, insert_penalties:=0, save split_top_skip before calling 925
  899. q) Module 921, restore split_top_skip before calling 924
  900. r) Module 928, set split_top_skip:=split_top_ptr(p) before prune_page_top
  901. s) Module 929, after q:=p, incr(insert_penalties)
  902. t) Module 929, before free_node, delete_glue_ref(split_top_ptr(p))
  903. u) Module 933, clear insert_penalties before calling 934
  904. v) Module 978, more local variables needed
  905. w) Module 1010, build the newfangled ins_node
  906.  
  907. 84. Scanner goes to new_line when <return> is category 13 (Jan 7, 1983)
  908. Insert state:=new_line in module 323 just before the reference to module 339;
  909. and delete "state:=new_line;" from modules 328 and 330 (and their names).
  910.  
  911. 85. Distinguish between user \kern and font \kern (Jan 9, 1983)
  912. The nontrivial parts of this are to change "type(s)<>kern_node" to
  913. "(type(s)<>kern_node)or(subtype(s)<>normal)" in modules 809 and 810;
  914. and to say "kern_node: if subtype(s)=explicit then goto done4" in module 812.
  915. The \kern primitive now has "explicit" instead of "normal" in 967.
  916.  
  917. 86. "ignorespace" becomes "ignorespaces" (Jan 9, 1983)
  918.  
  919. 87. Don't omit a blank space after \def, \message, \mark, etc. (Jan 9, 1983)
  920. <Scan an optional space> is removed from modules 431, 848, 874.
  921. "info(r):=space_token;" and "link(r):=get_avail; r:=link(r);" removed from 1278.
  922.  
  923. *** The above changes appear in Version 0.94.
  924.  
  925. Version 0.95
  926.  
  927. 88. New active characters in math mode (Jan 12, 1983)
  928. In module 1062, add a label "restart" and change lines -3 and -2 as follows:
  929. fam(p):=(c div 256) mod 16;
  930. if c>=var_code then
  931.   if fam(p)<8 then fam(p):=cur_fam
  932.   else begin <Convert c to an active character whose equivalent is
  933.                         ready to be scanned next>; goto restart;
  934.         end;
  935. In module 1064, the body of the procedure becomes
  936. begin if c>='4000 then <Convert c ...> else <the former body>; end
  937. And there's a new module:
  938. <Convert c...>=
  939. begin cs_ptr:=(c mod 128)+active_base;
  940. cur_cmd:=eq_type(cs_ptr); cur_chr:=equiv(cs_ptr); x_token; back_input;
  941. end
  942.  
  943. 89. Surprise bug: $1-$ treated the - as binary (Jan 15, 1983)
  944. New module <Convert a final bin_noad to an ord_noad>=
  945.         if r_type=bin_noad then type(r):=ord_noad
  946. is called in module 649 before the call of 678, and in module 651
  947. in the place where that code already appears.
  948.  
  949. 90. Another oversight (Jan 15, 1983)
  950. Add "space_factor:=1000;" after "push_nest" in modules 1027, 1029
  951.  
  952. 91. And a more embarrassing one (Jan 16, 1983)
  953. I forgot "spotless:=false;" at the beginning of the procedure in module 80.
  954. But while fixing this, I decided to make it more general since IBMers want
  955. a return code at the end of the job. So there's a history variable that has
  956. four values: spotless, warning_issued, error_message_issued, fatal_error_stop.
  957. a) module 75: declare history, define spotless etc.
  958. b) module 76: initialize history:=spotless
  959. c) module 80: if history<error_mess... then history:=error_mess...
  960. d) 80 and 90: history:=fatal_error_stop before jump_out
  961. e) 92: if history<error_message_issued then
  962. f) 232: if history=spotless then history:=warning_issued
  963. g) 1243: if history=warning_issued then print_nl("(see the log...)")
  964.  
  965. 92. "This can't happen" could happen, so there's new error recovery (Jan 16, 83)
  966. In module 933, replace the call on confusion by a call of the following module:
  967.         @ @<Recover from an unbalanced output routine@>=
  968.         begin print_nl("! Unbalanced \output routine");
  969.         help2("Your sneaky output routine has fewer real {'s than }'s.")@/
  970.         ("I can't handle that very well; good luck."); error;
  971.         repeat get_token;
  972.         until loc=null;
  973.         end
  974. In module 1278, replace the call on confusion by a call of:
  975.         @ @<Recover from an unbalanced write command@>=
  976.         begin print_nl("! Unbalanced \write command");
  977.         help2("On this page there's a \write with fewer real {'s than }'s.")@/
  978.         ("I can't handle that very well; good luck."); error;
  979.         repeat get_token;
  980.         until cur_tok=end_write_token;
  981.         end
  982.  
  983. 93. String overflow clobbered the log file (Jan 18, 1983)
  984. Also, "confusion" before log file open would cause problems.  Also start_input
  985. calling open_log_file calling prompt_file_name calling fatal_error!
  986. To fix these anomalies, open_log_file no longer calls prompt_file_name,
  987. if interaction<scrollmode; instead, it terminates after printing what went
  988. wrong. Also, the fatal_error and overflow and confusion procedures call
  989. the following new subroutine:
  990. procedure normalize_selector;
  991. begin if job_name>0 then selector:=term_and_log else selector:=term_only;
  992. if interaction=batch_mode then decr(selector);
  993. if job_name=0 then open_log_file;
  994. end;
  995.  
  996. 94. \ifeof\fi loops infinitely (Jan 18, discovered by Lamport)
  997. Change 72 converted such a \fi to <space>\fi. Now it is converted to \relax\fi.
  998.  
  999. 95. \limitswitch changed to \displaylimits et al. (Jan 18, 1983)
  1000. [Incidentally, this fixes a bug in the former positioning of \int\limitswitch]
  1001. a) module 608: subtype of Op can be normal, limits, or no_limits.
  1002. b) 620: display the subtype if not normal
  1003. c) 667: new logic decides limits before looking at the operand (and the operand
  1004.  is now called the nucleus); the italic correction is removed only if
  1005.  it should not be put back
  1006. d) 1069: subtype(tail):=cur_chr
  1007.  
  1008. 96. Minor changes to math in unusual cases (Jan 19, 1983)
  1009. a:delete "if height(y)<=0 then height(y):=default_rule_thickness" in module 658
  1010. b:move "if thickness(q)=default..." from module 664 to module 661
  1011. c:delete module 1081, that error message isn't worth the bother
  1012. d:in module 1062, char_num case, c:=math_code(cur_val) (if cur_val<128)
  1013. e:in module 1064, a similar change
  1014.  
  1015. 97. Bad spacing from change 6 is corrected (Jan 19, 1983)
  1016. underline, overline, radical, vcenter, and accent noads now revert to type
  1017. Ord instead of type Inner.
  1018. {...} produces type Ord also.
  1019. There's a new primitive \mathinner.
  1020. The new_noad function now produces an ord_noad (change its calls accordingly).
  1021. And the default is changed in module 679 to t:=ord_noad; the fraction_noad
  1022. case sets t:=inner_noad, and the (inner_noad,ord_noad) cases swap places.
  1023.  
  1024. 98. New \mathchoice primitive (Jan 19, 1983)
  1025. a) module 204: new command
  1026. b) 254: math_choice_group
  1027. c) 614: style node three words long, so a choice node can be converted to it
  1028. d) 614a: choice node has four subfields: display_mlist, text_mlits, etc.
  1029. e) 1081a: routines to build a choice_node like 1027-1029 build discretionaries
  1030.  
  1031. 99. \input moves to syntax from semantics (Jan 19, 1983)
  1032. a) 204, 206: renumber commands
  1033. b) When input is to be expanded, if name_in_progress then insert_relax
  1034. c) 459,464: name_in_pr:=true; begin_name;...end_name; name_in_pr:=false;
  1035. d) 406,461: declare name_in_progress, a global boolean initially false
  1036.  
  1037. 100. \chardef joins \mathchardef (Jan 19, 1983)
  1038. a) 204: math_only becomes math_given; add new command char_given
  1039. b) 205: new command char_def
  1040. c) 250,251: new primitive char_def
  1041. d) 380: char_given,math_given yield integer after \the
  1042. e) 401: char_given,math_given yield integer in context of integer
  1043. f) 936,943: char_given treated like other_char
  1044. g) 1062,1064: same, if cur_chr<128, else assume math_code(x)=x
  1045. h) 1143,1144: char_def is analogous to math_char_def
  1046.  
  1047. 101. \unbox becomes \unhbox,\unvbox; also add \unhcopy (Jan 19, 1983)
  1048. Module 1020 changes in the obvious way.
  1049.  
  1050. 102. \spacefactor, \pagetotal, etc. move to prefixed_command (Jan 20, 1983)
  1051.  
  1052. 103. \hrule in horizontal mode, \vrule in vertical mode: switch modes (Jan 20)
  1053.  
  1054. 104. \globaldefs parameter, affects prefixed_command (Jan 20, 1983)
  1055.  
  1056. 105. After looking at frequency counts, some optimizations made (Jan 21, 1983)
  1057. a) "fast_get_avail" and "fast_store_new_token" introduced to speed up the loops
  1058. in modules 360 and 431.
  1059. b) some procedure call overhead eliminated in begin_token_list, end_token_list,
  1060. back_input, and flush_node_list.
  1061. c) a few if tests changed from "if a and b then" to "if a then if b then".
  1062.  
  1063. 106. Changes for space efficiency in math constructions (Jan 22, 1983)
  1064. a) In module 1102, mlist_penalties:=(mode>0)
  1065. b) The following code is inserted before "free_node" in module 639 (rebox):
  1066.         if (is_char_node(p))and(link(p)=null) then
  1067.                 begin f:=font(p); v:=char_width(f)(char_info(f)(character(p)));
  1068.                 if v<>width(b) then link(p):=new_kern(width(b)-v);
  1069.                 end;
  1070. c) A new module is called just before clean_box exits:
  1071. <Simplify a trivial box>=
  1072. q:=list_ptr(x);
  1073. if is_char_node(q) then
  1074.         begin r:=link(q);
  1075.         if r<>null then if link(r)=null then if type(r)=kern_node then
  1076.                 begin free_node(r,small_node_size); link(q):=null;
  1077.                 end;
  1078.         end
  1079.  
  1080. 107. Oversight in rebox routine (module 639) corrected (Jan 22, 1983)
  1081. if type(b)=vlist_node then b:=hpack(b,natural);
  1082.  
  1083. 108. Module 217 clobbers eqtb[bad_font_ident] set in change 26q (Jan 22, 1983)
  1084. Decided to fix this by making \nullfont a primitive.
  1085. This means the procedure missing_font can be deleted, and the test for
  1086. undefined font can be removed from the inner loop.
  1087. (This reflects a rather dramatic change from TeX80, where
  1088. a missing font was a fatal "Whoa" error!)
  1089. Note: I thought I could delete module 646, but realized that it still provides
  1090. a useful error message. The dump/undump routines (cf. change 26ee) now
  1091. dump the null_font information too, as its parameters can be changed.
  1092.  
  1093. 109. End of program now lists all incomplete \ifs (Jan 24, 1983)
  1094.  
  1095. 110. Alignment preamble setup to allow \halign\lb (Jan 29, 1983)
  1096. The statement "align_state:=-1000000;" is inserted near the beginning
  1097. of module 695 (and the comment about align_state=-999999 is deleted).
  1098. The constant -999999 is changed to -1000000 in modules 700 and 701.
  1099.  
  1100. 111. Forgot to test is_char_node(r) (Jan 30, 1983)
  1101. in the <Simplify a trivial box> code of change 106c.
  1102. By coincidence, this was caught since somebody used font number 11
  1103. in the second character of a list of length 2!
  1104.  
  1105. 112. Improved format for stats at end of run (suggested by DRF, Jan 30, 1983)
  1106. Module 1242 changes; nothing subtle.
  1107.  
  1108. **** The changes above have been incorporated into version 0.95
  1109.  
  1110. Version 0.96
  1111.  
  1112. 113. space after one-symbol control sequences NOT to be ignored unless
  1113. the catcode of that symbol is letter or spacer. (Jan 30, 1983)
  1114. The name of module 334 changes slightly; the state is set based
  1115. on cat_code(cur_chr), shortly after label start_cs.
  1116. A new variable cat is introduced and set to cat_code(cur_chr) in modules
  1117. 334 and 336.
  1118.  
  1119. 114. trailing spaces removed on all lines of input (Jan 30, 1983)
  1120. last_nonblank is added to input_ln routine (module 31)
  1121.  
  1122. 115. mmode+accent gives error but assumes math_accent (Feb 3, 1983)
  1123. This goes into math_ac procedure (module 1075); module 1035 is eliminated.
  1124.  
  1125. 116. \iftrue and \iffalse (Feb 5, 1983)
  1126. Simple addition of two new conditions.
  1127.  
  1128. 117. Bad calculation of size for \left and \right (Feb 6, 1983)
  1129. In module 680, the first assignment to delta should be
  1130.         delta:=(delta1 div 500)*delimiter_factor.
  1131.  
  1132. 118. \delimitershortfall (new name) replaces \delimiterlimit. (Feb 12)
  1133.  
  1134. 119. \abovewithdelims.. to be equivalent to \above (Feb 12)
  1135. Module 1089 revised so that the delimiters are scanned before the dimension.
  1136.  
  1137. 120. Remove the kludgy math codes introduced in change 88 (Feb 12)
  1138. \fam becomes a normal integer parameter
  1139. and \mathcode stored with min_halfword added
  1140. and \mathcode allowed to be 32768
  1141. and current family is substituted only when it's in range.
  1142. Also the initialization of mathcode for letters now specifies family 1.
  1143. (This implies a dozen or so obvious revisions.)
  1144.  
  1145. 121. Bug in module 1152: max spacefactor is 32767 (Feb 12)
  1146. also module 1013 gets a restricted range
  1147.  
  1148. 122. Octal output to be replaced by hexadecimal. (Feb 14)
  1149.  
  1150. 123. Forgot to include char_given in module 1037, re change 100 (Feb 14)
  1151.  
  1152. 124. vmode+valign,hmode+halign made legal transitions (Feb 17)
  1153.  
  1154. 125. \tracingrestores (Feb 18)
  1155. This involves a lot of new, rather tedious code that's interspersed with the
  1156. eqtb definitions (the body of a procedure called show_eqtb).
  1157.  
  1158. 126. New error message for hmode+hrule in -hmode. (Feb 25)
  1159. head_for_vmode now suggests \leaders in this case. [improves change 103]
  1160.  
  1161. 127. under/overfull boxes in alignment: Better message. (Feb 27)
  1162. par_begin_line becomes pack_begin_line, and it is set (negative) in
  1163. module 719, read in modules 590 and 601.
  1164.  
  1165. 128. New \xcr feature. (suggested by Lamport comments, Mar 4)
  1166. align_peek (module 702) ignores it, otherwise it acts like ordinary \cr.
  1167.  
  1168. 129. In stats, subtract out TeX's own string requirements (Mar 4)
  1169. init_pool_ptr and init_str_ptr variables added in obvious way
  1170. (declared in module 39, set in module 1240, used in module 1242)
  1171.  
  1172. 130. \everyhbox and \everyvbox. (Mar 6)
  1173. The modifications are obvious; for example, module 1076 gets the statement
  1174.         if every_vbox<>null then begin_token_list(every_vbox,every_vbox_text);
  1175. and a similar pair of statements goes into module 993.
  1176.  
  1177. 131. Precaution in module 1105 error recovery (March 9, 1983)
  1178. Change the first test to "if (a=null)or danger", in order to
  1179. avoid accessing math_quad when the symbol fonts aren't known to be present.
  1180.  
  1181. 132. Installed float and unfloat to aid portability (suggested by HWT, 3/7/83)
  1182.  
  1183. 133. \dispskip becomes \abovedisplayskip and \belowdisplayskip (3/9/83)
  1184. Also \dispaskip becomes \abovedisplayshortskip; \dispbskip similar.
  1185.  
  1186. 134. \romannumeral separated from \number (suggested by FY, March 10)
  1187. Obvious changes; print_roman_int now accepts negative input but gives
  1188. no output in such cases (the test in module 68 becomes "if n<=0 then return").
  1189.  
  1190. 135. scan_keyword to ignore leading spaces (Mar 12)
  1191. In module 375, change "else begin" to
  1192. "else if (cur_cmd<>spacer)or(p<>backup_head) then begin".
  1193.  
  1194. 136. Update to change 112 (Mar 14)
  1195. Module 1242 now uses write and write_ln directly (saves space and time).
  1196.  
  1197. 137. Another change to page-break cost (suggested by Lamport, March 16)
  1198. Cf. change 83k above; the relevant lines of module 914 now read
  1199.         if b<awful_bad then
  1200.                 if pi<=eject_penalty then c:=pi
  1201.                 else    if b<inf_bad then c:=b+pi+insert_penalties
  1202.                         else c:=deplorable
  1203.         else c:=b;
  1204.         if insert_penalties>=10000 then c:=awful_bad;
  1205. and a similar change (but without insert_penalties) occurs in module 887.
  1206.  
  1207. **** The changes above have been incorporated into version 0.96 (March 16, 1983)
  1208.  
  1209. Version 0.97
  1210.  
  1211. 138. \everyjob (suggested by FY, March 18)
  1212. Module 936: main_control inserts every_job as its first action.
  1213.  
  1214. 139. Improved printout of macro definitions (March 19)
  1215. In module 278, simply treat left_brace like right_brace.
  1216. (This corresponds to the way the manual describes parameter matching.)
  1217.  
  1218. 140. Omit blanks as non-delimited parameters (March 19)
  1219. In module 360, replace
  1220.         else store_new_token(cur_tok);
  1221. by
  1222.         else @<Store the current token, but |goto continue| if it is
  1223.                  a blank space that would become an undelimited parameter@>;
  1224. Then define @<Store the current token...@> to be:
  1225. begin if cur_tok=space_token then
  1226.         if info(r)<=end_match_token then
  1227.                 if info(r)>=match_token then goto continue;
  1228. store_new_token(cur_tok);
  1229. end
  1230.  
  1231. 141. Minor patch in module 386, catches mu_glue (March 21)
  1232. begin cur_val:=zero_glue; cur_val_level:=glue_val;
  1233. if not is_char_node(tail)and(mode<>0) then
  1234.         begin if type(tail)=glue_node then
  1235.                 begin cur_val:=glue_ptr(tail);
  1236.                 if subtype(tail)=mu_glue then cur_val_level:=mu_val;
  1237.                 end;
  1238.         end
  1239. else if (mode=vmode)and(tail=head)and(last_page_glue<>max_halfword) then
  1240.         cur_val:=last_page_glue;
  1241. end
  1242.  
  1243. 142. Patch in module 699, \span expands only one level (March 21)
  1244. (See previous change #42.) The "get_x_token" in the code
  1245. while (cur_chr=span_code)and(cur_cmd=tab_mark) do get_x_token;
  1246. should be replaced by:
  1247.         begin get_token;
  1248.         if cur_cmd>max_command then
  1249.                 begin expand_calls; get_token;
  1250.                 end;
  1251.         end
  1252.  
  1253. 143. Single # in \tokens, \message, etc. (March 22)
  1254. (The previous rule was really bad in connection with \uppercase,
  1255. or with \write when #'s had to be given four times!)
  1256. Module 437 should be prefaced with "if macro_def then".
  1257. And get_token should become get_x_token there, if xpand is true.
  1258.  
  1259. 144. Keyword "to" required in \read. (March 22)
  1260. This will avoid the common error of a missing space before the \cs.
  1261. Also the stream number can be out of range, for terminal input.
  1262. The stream number in a \write can be out of range too, for terminal output.
  1263. Modules 1145 and 1258 and 1280, etc., change in the obvious ways.
  1264.  
  1265. 145. \ifeven<countnumber> replaced by \ifodd<number> (March 26)
  1266. This makes the language more consistent.
  1267.  
  1268. 146. Big surprise bug relating to \if\if aabc\fi (March 26)
  1269. (related to change 45; the possibility that cur_if might not be the
  1270. correct one when the conditional is evaluated was discovered today)
  1271. The main change is to add the change_if_limit procedure, and to add
  1272. the variable save_cond_ptr and the code that now depends on it.
  1273.  
  1274. 147. \if and \ifcat should tolerate primitives (March 28)
  1275.  
  1276. 148. "absent" becomes "void", a better word (March 28)
  1277.  
  1278. 149. Module 990: \lastbox to clear the shift_amount (March 28)
  1279. since I don't want to figure out what it means in all cases (\vsplit, etc)
  1280.  
  1281. 150. print_err("...") takes the place of print_nl("! ...") (DRF, March 29)
  1282. And wake_up_terminal is introduced in module 34, and used in modules
  1283. 37, 70, 341, 441, 457, 463, 1210, 1240, 1246.
  1284.  
  1285. 151. \halign extended to periodic preambles (April 1)
  1286. Modules 688--690: cur_loop introduced, stacked/unstacked
  1287. Module 695: cur_loop initialized
  1288. Module 700: cur_loop set up
  1289. Module 708--709: cur_loop used and advanced
  1290.  
  1291. 152. \leaders to align by the smallest enclosing box. (April 1)
  1292. Module 549: new local variable left_edge, initialized to cur_h
  1293. Module 557: cur_h:=left_edge+leader_wd*((cur_h-left_edge) div leader_wd)
  1294. Module 559: new local variable top_edge, initialized to cur_v-height(this_box)
  1295. Module 566: analogous to 557
  1296.  
  1297. 153. hyphenation after whatsits is OK (April 1)
  1298. In module 809, skip past whatsits
  1299.  
  1300. 154. \par in vertical mode should build_page (April 2)
  1301. vmode+par_end moves from 952 to 1005
  1302.  
  1303. 155. Clear aux to zero in module 703 (April 2)
  1304.  
  1305. 156. Digits will switch families (April 4)
  1306. (initialize their math codes differently in module 225)
  1307.  
  1308. 157. Refinement to correction 83m (April 7)
  1309. the test for not splitting should be
  1310.         if ((h<=0)or(h<=delta))and(height(p)+height(r)<=dimen(n)) then
  1311.  
  1312. 158. (re 128) \xcr renamed to \crcr, at Lamport's request. (April 8)
  1313.  
  1314. 159. Better error recovery in runaway preamble (April 11)
  1315. Module 319, aligning: set align_state:=-1000000
  1316.  
  1317. 160. \read to get balanced braces (April 12)
  1318. Module 440 changed to look more like 431.
  1319. Module 443 gives error message if the \read goes off end of file.
  1320. Module 319 removes \outer from forbidden control sequence that is \read.
  1321.  
  1322. 161. Bug found by Jim Sterken (April 14)
  1323. Module 798 can make q a char_node, so module 794 needs this patch:
  1324.         if not is_char_node(q) then
  1325. to be inserted just before "if (type(q)=math_node)..."
  1326.  
  1327. 162. \uppercase and \lowercase to apply to all characters (April 15)
  1328. module 1196 changes; also I put active_base before single_base in eqtb
  1329.  
  1330. **** The changes above have been incorporated into version 0.97 (April 16, 1983)
  1331. **** except the part of 144 about \read-1 was forgotten and put in 0.98 later
  1332.  
  1333. Version 0.98
  1334.  
  1335. 163. change small_number to 0..65 in module 814 (found by DRF, April 17)
  1336.  
  1337. 164. improved error recovery in module 1166 (suggested by DRF, April 17)
  1338. after error: repeat get_token; until cur_cmd=right_brace; {flush the patterns}
  1339.  
  1340. 165. improved \read from terminal (suggested by Todd Allen at Yale, May 1)
  1341. I had forgotten to implement the extended stream numbers in change 144.
  1342. Also, the prompt is now omitted if n<0.
  1343.  
  1344. 166. \write n writes only to the log file, if n<0. (May 18)
  1345.  
  1346. 167. Unified syntax for parameters and registers. (May 18)
  1347. a) Command code changes: def_font moved to before prefix;
  1348.    register eliminated; set_register renamed register and
  1349.    moved (with adv_register...div_register) to before prefix;
  1350.    min_internal and max_internal defined.
  1351. b) scan_the renamed scan_something_internal, and it acts on cur_tok.
  1352. c) scan_int, scan_dimen, scan_glue simplified accordingly; instead of
  1353.    testing for cur_cmd=the or cur_cmd=register, they now test
  1354.    cur_cmd versus min_internal and max_internal.
  1355. d) ins_the is removed.
  1356. e) \minusthe is removed. Consequently "the_toks" needs no parameter.
  1357.  
  1358. 168. new parameters \hoffset, \voffset (May 18)
  1359.  
  1360. 169. \everycr (suggested by Spivak, installed May 24)
  1361.  
  1362. 170. \countdef, \dimendef, etc. (suggested by DRF long ago, installed May 25)
  1363. Straightforward change to internal representation of assign_int and similar
  1364. commands, so that the chr part is now a pointer to the eqtb location.
  1365.  
  1366. 171. \advance, \multiply, \divide (suggested by FY, installed May 25)
  1367.  
  1368. 172. \hyphenchar (May 25)
  1369. A new command assign_font_int is introduced, and incorporated into
  1370. scan_something_internal and prefixed_command in the usual way.
  1371. The hyphen_char array entries are initialized in modules 483 and 506,
  1372. allocated in 482, used in modules 809 [is hyphenation to be suppressed?],
  1373. 828 [insert the hyphen character], 946 [insert discretionary node
  1374. following hyphen], 1027 [implementation of \-].
  1375. hyphen_char[k] is dumped and undumped in modules 1229 and 1230.
  1376.  
  1377. 173. \skewchar (May 25)
  1378. Loaded and fetched with the same command code as \hyphenchar.
  1379. Module 659 gets a dozen more lines of program, to compute the skew.
  1380.  
  1381. 174. \noexpand (May 25)
  1382. This involves: introduction of no_expand and dont_expand command codes;
  1383. frozen_dont_expand as an internal marker; small change to get_next
  1384. when that marker is sensed; change to processing of \if and \ifcat;
  1385. implementation of no_expand in the expand_calls subroutine.
  1386. I also changed the name of expand_calls to "expand".
  1387.  
  1388. 175. \meaning (May 25)
  1389. This adds one case to the "convert" command.
  1390. print_meaning is a new subroutine, using code that was in show_whatever.
  1391.  
  1392. 176. "dm" and "vu" are out, ".5\hsize" is in (May 25)
  1393. Straightforward changes to module 416.
  1394.  
  1395. 177. \texinfo f n becomes \fontdimen n f (May 25)
  1396.  
  1397. 178. \afterassignment (suggested by ARK, May 27)
  1398.  
  1399. 179. \chardef\xx=5\xx shouldn't say that \xx is undefined (May 27)
  1400.  
  1401. 180. \relax to be ignored like spaces in math mode (May 28)
  1402. and in a few other places: <Get next non-blank non-relax non-call token>
  1403. is now used in modules 379, 988, 994, 1062, 1070, 1134, 1179
  1404. (i.e., scan_left_brace, scan_box, scan_math, scan_delimiter, prefixed_command,
  1405. do_assignments, and just after \leaders).
  1406.  
  1407. 181. improve \mathaccent wrt sub/superscripts (sugg by HWT, May 30)
  1408.  
  1409. 182. its_all_over: remove dead_cycles>max_dead_cycles (May 30)
  1410. Modules 961 and 962 are combined and simplified.
  1411.  
  1412. *** The changes above were installed into version 0.98 on May 31, 1983 ***
  1413.  
  1414. Version 0.99
  1415.  
  1416. 183. \mark and \insert and \vadjust allowed in restricted hmode (Jun 3)
  1417. also in math; this is a comparatively big change
  1418. [at present, \mark in a display causes TeX to crash with "can't happen"!]
  1419. modules 652 and 679: mark_node,ins_node,adjust_node now permitted
  1420. modules 576 and 578: t becomes a global variable adjust_tail
  1421. modules 802 and 1110: new calling sequence to get the adjustments
  1422. modules 254, 986, 993, 995, 996: adjusted_hbox_group for the new kind of hbox
  1423. modules 698--690: cur_head and cur_tail added to alignment stack
  1424. modules 703, 712, 715: adjustments gathered and appended during \halign
  1425.  
  1426. 184. \ht, \wd, and \dp (Jun 6)
  1427.  
  1428. 185. When displaying noads, use ^ and _ instead of ( and [ (Jun 6)
  1429.  
  1430. 186. A..F in hex constants could be otherchar as well as letter (Jun 6)
  1431.  
  1432. 187. Remove <scan optional space> from module 417 (Jun 7)
  1433. (it was redundant code)
  1434.  
  1435. 188. \mkern .5\thinmuskip and \mkern\thinmuskip should be legal (Jun 7)
  1436.  
  1437. 189. 2.5\space\space\dimen0 should work (Jun 7)
  1438. previously it worked after "plus" or "minus" only!
  1439.  
  1440. 190. <font identifier> to allow also \font for current font (Jun 7)
  1441. "if cur_cmd=def_font then f:=cur_font else" added to module 507
  1442.  
  1443. 191. \gdef not to be global when \globaldefs<0 (Jun 7)
  1444. "and (global_defs>=0)" added to module 1139
  1445.  
  1446. 192. \advance\spaceskip by-\spaceskip should yield zero_glue (Jun 7)
  1447. the procedure trap_zero_glue is culled from module 1147
  1448.  
  1449. 193. \show should work with any token (Jun 7)
  1450.  
  1451. 194. \tokens to become 256 registers (Jun 8)
  1452. \toks and \toksdef added in the straightforward way
  1453. (this affects mainly eqtb, scan_something_internal, prefixed_command)
  1454.  
  1455. 195. allow \indent in math mode (Jun 8)
  1456. also, \valign in math mode to give missing $ error
  1457. modules 1001 and 1043 disappear; 1004 is generalized slightly.
  1458.  
  1459. 196. remove redundant code (Jun 8)
  1460. In module 1044, there's no need to check cur_group and call off_save.
  1461. Similarly in module 1053.
  1462.  
  1463. 197. new_write_whatsit shouldn't allow \openout-1, \closeout-1 (Jun 8)
  1464. (simple change to module 1258)
  1465.  
  1466. 198. \lastbox should give error in math mode (Jun 8)
  1467. (simple change to module 990)
  1468.  
  1469. 199. \leaders not followed by proper glue should be back_error (Jun 9)
  1470. [I made the change; TRIP should test this error message!]
  1471.  
  1472. 200. Module 702, correction to beginning of \noalign (Jun 9)
  1473. if mode=-vmode then normal_paragraph;
  1474.  
  1475. 201. After alphabetic constant, expand the optional space (Jun 10)
  1476.  
  1477. 202. Set space_factor:=1000 after rule or constructing an accent (Jun 12)
  1478. That's in modules 964 and 1036.
  1479.  
  1480. 203. blunder in module 783 (caught by Jim Sterken, fixed Jun 14)
  1481. disc_width:=0 needs to be set before testing if s=null
  1482. (A real bug that existed since the beginning! It showed up on page 37
  1483.   of the September 1982 TRIP manual; my hand-checking was incomplete...)
  1484.  
  1485. 204. Change to optional spaces after <dimen> (Jun 14)
  1486. The optional space will now be analogous to that after <number>.
  1487.  
  1488. 205. Fix conflict between \output and \everydisplay (Jun 14)
  1489. In change 49, I should have inserted every_display before calling build_page.
  1490.  
  1491. 206. Overflow errors to be consistent with statistics reporting (Jun 17)
  1492.  
  1493. 207. \tracing switches to be all positive vs nonpositive (Jun 17)
  1494.  
  1495. *** The changes above were installed into version 0.99 on June 19, 1983 ***
  1496.  
  1497. Version 0.999
  1498.  
  1499. [these changes are not yet in the distributed code]
  1500.  
  1501. 208. \catcode`\%=14 to be done by INITEX (Jun 20)
  1502.  
  1503. 209. \par in vmode to clear parshape etc. (Jun 21)
  1504. Module 1005, which contains vmode+par_end, now calls normal_paragraph.
  1505.  
  1506. 210. Improvement to change 39 (Jun 21)
  1507. Module 593, overfull_rule not appended if solely due to hbadness
  1508.  
  1509. 211. Alignment bug allows glue_set to be less than -1! (Jun 21)
  1510. Modules 723 and 724 need to be patched.
  1511.  
  1512. 212. Correction to change 134 (found by Debby Clark, Jun 22)
  1513. Module 68: n to be declared integer, not nonnegative_integer.
  1514.  
  1515. 213. "by" to be optional (suggested by Lamport, Jun 22)
  1516. Module 1158 disappears
  1517.  
  1518. 214. Module 1235, slight change in format_ident message (Jun 24)
  1519.  
  1520. 215. New measures needed to thwart trickery (Jun 25)
  1521. Glue set values computed by \span could have been brought into
  1522. TeX's registers via, e.g., \valign and \vsplit; so the
  1523. "kern" idea of module 722 is insufficient and should be abandoned.
  1524. Extra boxes and glue are added; this has additional virtue
  1525. of perfect accuracy in alignment of vertical rules.
  1526. The main change is to introduce a new module after 722, in which s and t
  1527. are updated for spans, and to eliminate the "equivalent kern" code from 719
  1528. (the corresponding glue calculations are now done in the new module).
  1529.  
  1530. 216. leaders to affect height/width of their boxes (Jun 25)
  1531. Module 583 splits into two parts (one for hpack, one for vpack).
  1532.